package main

import (
	"fmt"
	"github.com/spf13/viper"
	"os"
	"strings"
)

// https://www.cnblogs.com/liweiboy/p/16100446.html
// 配置解析神器：Viper 使用介绍 - liweiboy - 博客园
func main() {
	viper.SetEnvPrefix("java") //前缀，理解为命名空间，表示某些固定开头的配置是某个系统独占使用
	viper.BindEnv("home")      //绑定了  环境变量： JAVA_HOME
	ChainVersion := viper.GetString("home")
	fmt.Printf("java home is : %s \n", ChainVersion)
	//环境变量有个坑，windows新增环境变量不会立即生效，需要重启系统等
	//see：  详解Windows不重启使环境变量修改生效(经典) - 怀英$$$ - 博客园 https://www.cnblogs.com/zht-blog/p/4033951.html。
	//演示可以直接拿已有的环境变量来测  如JAVA_HOME  NVM_HOME

	//演示时 也可以使用os.Setenv在程序设置环境变量
	prefix := "hxchain"
	envs := map[string]string{
		"LOG_LEVEL":      "INFO",
		"MODE":           "DEV",
		"MYSQL_USERNAME": "root",
		"MYSQL_PASSWORD": "xxxx1234",
	}
	for k, v := range envs {
		key := fmt.Sprintf("%s_%s", prefix, k)
		os.Setenv(key, v)
		fmt.Printf("显示设置环境变量，键：%s ，值：%s\n", key, v)
	}
	v := viper.New()
	v.AutomaticEnv()

	v.SetEnvPrefix(prefix)
	v.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
	//环境变量自动识别为前缀_开头，_分隔的全大写名称，并与小写的键名通过.或-分隔的viper键 进行映射，通过aaa.bbb即可读取“PREFIX_AAA_BBB”
	readKeys := []string{"mode", "log.level", "mysql.username", "mysql.password"}

	for _, k := range readKeys {
		fmt.Printf("env `%s` = %s\n", k, v.GetString(k))
	}
}
